package routes

import (
	"embed"
	"fmt"
	"io"
	"io/fs"
	"net/http"
	"strings"
	"time"

	"github.com/gorilla/mux"

	"filehive-backend/config"
	"filehive-backend/handlers"
	"filehive-backend/middleware"
)

// SetupRoutes 设置路由
func SetupRoutes(cfg *config.Config, embeddedFS embed.FS) *mux.Router {
	// 创建路由器
	r := mux.NewRouter()

	// 应用中间件
	r.Use(middleware.CORS)
	r.Use(middleware.Logging)

	// 创建处理器
	fileHandler := handlers.NewFileHandler(*cfg)
	uploadHandler := handlers.NewUploadHandler(*cfg)

	// API 路由 - 必须在静态文件路由之前
	api := r.PathPrefix("/api").Subrouter()
	api.HandleFunc("/files", fileHandler.GetFiles).Methods("GET")
	api.HandleFunc("/upload", uploadHandler.UploadFiles).Methods("POST")
	api.HandleFunc("/folder", fileHandler.CreateFolder).Methods("POST")
	api.HandleFunc("/download", fileHandler.DownloadFile).Methods("GET")
	api.HandleFunc("/files", fileHandler.DeleteFiles).Methods("DELETE")
	api.HandleFunc("/move", fileHandler.MoveFile).Methods("PUT")
	api.HandleFunc("/info", fileHandler.GetFileInfo).Methods("GET")

	// 设置嵌入的静态文件服务
	setupEmbeddedStaticServer(r, embeddedFS)

	return r
}

// setupEmbeddedStaticServer 设置嵌入的静态文件服务
func setupEmbeddedStaticServer(r *mux.Router, embeddedFS embed.FS) {
	// 从嵌入的文件系统中获取dist/frontend/dist子目录
	distFS, err := fs.Sub(embeddedFS, "dist/frontend/dist")
	if err != nil {
		fmt.Printf("⚠️  无法获取嵌入的dist/frontend/dist目录: %v\n", err)
		// 如果嵌入文件有问题，使用fallback处理器
		r.PathPrefix("/").HandlerFunc(handlers.RootHandler)
		return
	}

	fmt.Println("✅ 使用内嵌前端文件系统")

	// 创建HTTP文件服务器
	fileServer := http.FileServer(http.FS(distFS))

	// 创建自定义的文件服务器处理器
	staticHandler := func(w http.ResponseWriter, r *http.Request) {
		path := r.URL.Path
		
		// 记录请求
		fmt.Printf("📡 静态文件请求: %s\n", path)
		
		// 如果是根路径，直接提供index.html内容
		if path == "/" {
			if file, err := distFS.Open("index.html"); err == nil {
				defer file.Close()
				fmt.Println("📄 提供根路径index.html")
				w.Header().Set("Content-Type", "text/html; charset=utf-8")
				http.ServeContent(w, r, "index.html", time.Time{}, file.(io.ReadSeeker))
				return
			}
		}
		
		// 尝试直接提供请求的文件
		if _, err := distFS.Open(strings.TrimPrefix(path, "/")); err == nil {
			fmt.Printf("📁 提供静态文件: %s\n", path)
			fileServer.ServeHTTP(w, r)
			return
		}
		
		// 对于SPA路由（不包含文件扩展名的路径），返回index.html内容
		if path != "/" && !strings.Contains(path, ".") {
			if file, err := distFS.Open("index.html"); err == nil {
				defer file.Close()
				fmt.Printf("🔄 SPA路由返回index.html: %s\n", path)
				w.Header().Set("Content-Type", "text/html; charset=utf-8")
				http.ServeContent(w, r, "index.html", time.Time{}, file.(io.ReadSeeker))
				return
			}
		}
		
		// 文件不存在，返回404
		fmt.Printf("❌ 内嵌文件不存在: %s\n", path)
		http.NotFound(w, r)
	}

	// 注册静态文件路由
	r.PathPrefix("/").HandlerFunc(staticHandler).Methods("GET")
} 